package strategypattren;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 策略模式，它实际上指，在一个方法中，流程是确定的，但是，某些关键步骤的算法依赖调用方传入的策略
 * 这样，传入不同的策略，即可获得不同的结果，大大增强了系统的灵活性
 * <p>
 * 策略的上下文
 */
public class DiscountContext {

    // 持有某个策略:
    private DiscountStrategy strategy = new UserDiscountStrategy();

    // 允许客户端设置新策略:
    public void setStrategy(DiscountStrategy strategy) {
        this.strategy = strategy;
    }

    public BigDecimal calculatePrice(BigDecimal total) {
        // 总金额 - 折扣价格 = 返回的实际价格
        // 不同的策略有不同的折扣价
        return total.subtract(this.strategy.getDiscount(total)).setScale(2, RoundingMode.DOWN);
    }
}
